cmake_minimum_required(VERSION 3.15 FATAL_ERROR)

#设置项目名称以及版本号
project(CMakeQuick VERSION 1.0.0)


#注：对于每个CMAKE开头的全局作用变量一般都会有对应的target变量
#指定编译文件输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) #静态库  dll导入库
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) #可执行文件 动态库
#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/Bin) 
# set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/Bin)
# set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)


#编译时生成汇编文件。所有配置的工程都应用变量CMAKE_CXX_FLAGS进行配置
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FAs") 
#修改默认的RELWITHDEBINFO的工程配置，去除C++优化
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/Zi /Od /Ob1 /RTC1")
#设置C++标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED true)
#debug模式下，二进制文件添加后缀，对于可执行文件无效。
set(CMAKE_DEBUG_POSTFIX "_d") 

# 默认install路径
set(CMAKE_INSTALL_PREFIX "${PROJECT_BINARY_DIR}/Install")



#############################################################################
#宏定义
#############################################################################
#查找Qt库,参数：指定Qt库路径，超出预期参数作为qt要求的组件。
macro(Find_Qt QT_PATH)
    set(Qt5_DIR ${QT_PATH})
    set(COMPONENTS_LIST "")
    set(LIST_VAR "${ARGN}") #ARGN 存放调用宏时，传入超出预期的参数
    if(${ARGC} GREATER 2)   #ARGC 参数的总个数
        foreach(arg IN LISTS LIST_VAR) #在宏定义里面ARGN ARGC等等都不是一个真正的变量，所以必须要使用${}
            list(APPEND COMPONENTS_LIST ${arg})
        endforeach()
    else()
        list(APPEND COMPONENTS_LIST "Core" "Widgets" "Gui")
    endif()
    find_package(Qt5 REQUIRED COMPONENTS ${COMPONENTS_LIST})
    if(NOT Qt5_FOUND)
        message(FATAL_ERROR "Qt5 is not Found！")
    endif()
endmacro(Find_Qt)

#############################################################################
#定义函数 
#############################################################################
#(1)目标配置QT，ui文件查找设置为当前工程的resource文件夹中
# moc，rcc，uic开启
# target_name 组件（Widget Core）
function(Config_Qt target_name)
    set_target_properties(${ARGV0}
        PROPERTIES
        AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/resource
        AUTOMOC ON
        AUTORCC ON
        AUTOUIC ON)

    set(QT_INCLUDE_DIRS "")
    set(QT_LIB_DIRS "")
    if(${ARGC} GREATER 2)   
        foreach(arg IN LISTS ARGN) #在函数里面ARGN ARGC等等都是真正的变量
            list(APPEND QT_INCLUDE_DIRS "${Qt5${arg}_INCLUDE_DIRS}")
            list(APPEND QT_LIB_DIRS "Qt5::${arg}")
        endforeach()
    else()
        list(APPEND QT_INCLUDE_DIRS ${Qt5Widgets_INCLUDE_DIRS}  ${Qt5Gui_INCLUDE_DIRS} ${Qt5Core_INCLUDE_DIRS})
        list(APPEND QT_LIB_DIRS "Qt5::Widgets" "Qt5::Core" "Qt5::Gui")
    endif()

    target_include_directories(${ARGV0}
        PRIVATE
         ${QT_INCLUDE_DIRS})
    target_link_libraries(${ARGV0}
        PRIVATE  ${QT_LIB_DIRS})
endfunction()


#############################################################################
#添加子目录
#############################################################################
add_subdirectory("component\\library")
#add_subdirectory(QtForm)